#include "fscan.h"



void inicializarColas(cola_sectores sectores[30])
{
	int i;
	for(i=0;i<30;i++)
	{
		sectores[i].numeroDeSector = -1;
		sectores[i].tipoDePedido = N;
	}
}

void ordenarColaPedidosSCAN (cola_sectores colaDePedidos[30], char sentido, int posActual){
	cola_sectores colaMayores[30], colaMenores[30];
	int i=0;
	int mayores = 0;
	int menores = 0;

	inicializarColas (colaMayores);
	inicializarColas (colaMenores);

	//seprarMayoresMenores (Cola, colaMayores, colaMenores, sentido, &mayores, &menores);
	if (sentido == bajando){
			for (i=0; i<30; ++i){
				if (colaDePedidos[i].numeroDeSector >= posActual){
					colaMayores[mayores]=colaDePedidos[i];
					//printf("Sector %i mayor a posicionActual[%i]\n", colaDePedidos[i].numeroDeSector, posActual);
					++mayores;
					//printf("mayores = %i\n", mayores);
				}else{
					colaMenores[menores]=colaDePedidos[i];
					//printf("Sector %i menor a posicionActual[%i]\n", colaDePedidos[i].numeroDeSector, posActual);
					++menores;
					//printf("menores = %i\n", menores);
				}

			}
		}else if (sentido == subiendo){
			for (i=0; i<30; ++i) {
				if (colaDePedidos[i].numeroDeSector > posActual){
					colaMayores[mayores]=colaDePedidos[i];
					++mayores;
				}else{
					colaMenores[menores]=colaDePedidos[i];
					++menores;
				}

			}
		}else{printf("El sentido esta como el orto\n");}
	ordenarColaMayores (colaMayores, mayores);
	ordenarColaMenores (colaMenores, menores);
	printf("Hay %i mayores y %i menores a la posicion Actual\n", mayores, menores);
	if (sentido==subiendo){
		int total= mayores + menores;
		for (i=0;i<mayores;++i){
			colaDePedidos[i]=colaMayores[i];
		}
		int e=0;
		for (i=mayores;i<total;++i){//el -1 es para que de bien en el ejemplo, pero no deberia ir
			colaDePedidos[i]=colaMenores[e];
			++e;
		}
	}else if (sentido==bajando){
		int total= mayores + menores;
		for (i=0;i<menores;++i){
			colaDePedidos[i]=colaMenores[i];
		}
		int e=0;
		for (i=menores;i<total;++i){//el -3 es para que de bien en el ejemplo, pero no deberia ir
			colaDePedidos[i]=colaMayores[e];
			++e;
		}
	}else{printf("El sentido esta como el orto\n");}

}

void ordenarColaMayores (cola_sectores colaMayores[30], int mayores)
{
	int e,i,menor,posMenor;
	cola_sectores colaMayoresOrdenada[mayores];

	for (e=0; e<mayores; ++e){
		menor = colaMayores[0].numeroDeSector;
		posMenor=0;

		for (i=1; i<mayores; ++i){//Hago un recorrido buscando al menor dentro de los mayores y lo mando a la cola ordenada
			if (colaMayores[i].numeroDeSector<menor){
				menor= colaMayores[i].numeroDeSector;
				posMenor=i;
			}else if (colaMayores[i].numeroDeSector == menor){
				if (colaMayores[i].tipoDePedido < colaMayores[posMenor].tipoDePedido){
					menor= colaMayores[i].numeroDeSector;
					posMenor=i;
				}//Esto ordena segun la prioridad---> 1° Trace, 2° Escribir/Clean, 3° Lectura
			}
		}
		colaMayoresOrdenada[e]=colaMayores[posMenor];
		colaMayores[posMenor].numeroDeSector=10000;//le pongo 10000 para que no lo tenga en cuenta para la proxima
	}
	for(i=0;i<mayores;++i){
		colaMayores[i]=colaMayoresOrdenada[i];
	}
}

void ordenarColaMenores (cola_sectores colaMenores[30], int menores)
{
	int e,i,mayor,posMayor;
	cola_sectores colaMenoresOrdenada[menores];

	for (e=0; e<menores; ++e){
		mayor=colaMenores[0].numeroDeSector;
		posMayor=0;

		for (i=1; i<menores; ++i){//Hago un recorrido buscando al mayor dentro de los menores y lo mando a la cola ordenada
			if (colaMenores[i].numeroDeSector>mayor){
				mayor= colaMenores[i].numeroDeSector;
				posMayor=i;
			}else if (colaMenores[i].numeroDeSector == mayor){
				if (colaMenores[i].tipoDePedido < colaMenores[posMayor].tipoDePedido){
					mayor= colaMenores[i].numeroDeSector;
					posMayor=i;
				}//Esto ordena segun la prioridad---> 1° Trace, 2° Escribir/Clean, 3° Lectura
			}
		}
		colaMenoresOrdenada[e]=colaMenores[posMayor];
		colaMenores[posMayor].numeroDeSector=-1;//le pongo 10000 para que no lo tenga en cuenta para la proxima
	}
	for(i=0;i<menores;++i){
		colaMenores[i]=colaMenoresOrdenada[i];
	}
}

void traceFSCAN (int posActual, int secBuscado, int proxSector, char sentido, config Conf)
{
	ps PS_Actual, PS_Buscado, PS_Proximo;
	float tiempoConsumido;
	PS_Actual = pasarA_pistaSector (posActual, Conf);
	PS_Buscado = pasarA_pistaSector (secBuscado, Conf);
	PS_Proximo = pasarA_pistaSector (proxSector, Conf);
	printf("Posición actual: %i:%i\n", PS_Actual.pista, PS_Actual.sector);
	printf("Sector solicitado: %i:%i\n", PS_Buscado.pista, PS_Buscado.sector);
	printf("Sectores recorridos: ");
	tiempoConsumido = sectoresRecorridosFSCAN(posActual, secBuscado, sentido, Conf); //Funcion que muestra los sectores recorridos y calcula el tiempo
	printf("\n");
	printf("Tiempo consumido: %f ms\n", tiempoConsumido);
	printf("Próximo sector: %i:%i\n", PS_Proximo.pista, PS_Proximo.sector);

}

float sectoresRecorridosFSCAN(int posActual, int Buscado, char sentido, config Config)
{
	int i, j, tiempoSalto, PISTAS, SECTORES, MaxSector, PistaActual, SectorActual, PistaBuscada, SectorBuscado;
	float tiempoGiro, tiempoConsumido;
	ps PS_MaxSector, PS_Actual, PS_Buscado;
	tiempoConsumido = 0;
	tiempoSalto = Config.t_salto;
	tiempoGiro = tiempoDeGiro (Config);//tiempo que tarda en recorrer un sector

	PISTAS = Config.CHS.cilindros;
	SECTORES = Config.CHS.sectores;
	MaxSector = PISTAS * SECTORES;
	PS_MaxSector = pasarA_pistaSector(MaxSector, Config);
	PS_Actual = pasarA_pistaSector (posActual, Config);
	PS_Buscado = pasarA_pistaSector (Buscado, Config);
	PistaActual = PS_Actual.pista;
	SectorActual = PS_Actual.sector;
	PistaBuscada = PS_Buscado.pista;
	SectorBuscado = PS_Buscado.sector;

	if (posActual == Buscado){
		printf("Ninguno");
	}else if (posActual < Buscado){//el buscado es mayor al actual
		if(sentido == subiendo){
			if (PistaActual == PistaBuscada){//Si estan en la misma pista
				for (i=SectorActual+1; i<SectorBuscado; ++i){
					printf("%i:%i, ", PistaActual, i);
					tiempoConsumido = tiempoConsumido + tiempoGiro;
				}
				if (i==SectorBuscado){
					printf("%i:%i", PistaActual, i);
				}
				/*i=SectorActual+1;
				do{
					 printf("%i:%i, ", PistaActual, i);
					 i = (i+1) % SECTORES;
				}while(i!=SectorBuscado);*/
			}else{//La pista es mayor
				i = SectorActual+1;
				for (j=PistaActual+1; j<PistaBuscada; ++j){
					printf("%i:%i, ", j, i);
					tiempoConsumido = tiempoConsumido + tiempoSalto;
				}
				//tiempoConsumido = tiempoConsumido + tiempoSalto;
				do{
					printf("%i:%i, ", PistaBuscada, i);
					tiempoConsumido = tiempoConsumido + tiempoGiro;
					i = (i+1) % SECTORES;

				}while(i != SectorBuscado);
				if (i == SectorBuscado){
					printf("%i:%i", PistaBuscada, i);
				}

			}
		}else{//esta bajando---->tenemos que bajar hasta el 0:0 y despues subir hasta encontrar el sector
			i = SectorActual-1;
			for (j=PistaActual-1; j>0; --j){
				printf("%i:%i, ", j, i);
				tiempoConsumido = tiempoConsumido + tiempoSalto;
			}
			//tiempoConsumido = tiempoConsumido + tiempoSalto;
			do{
				printf("%i:%i, ", 0, i);
				tiempoConsumido = tiempoConsumido + tiempoGiro;
				--i;
			}while(i != 0);
			if (i==0){
				printf("0:0, ");//llegamos al 0:0, ahora hay que subir
			}//Ahora vamos a estar subiendo, pero el flag de sentido no se modifica, lo modifico desde el thread que controla las colas
			if (PistaBuscada != 0){
				for (j=1; j<PistaBuscada; ++j){

				printf("%i:%i, ", j, i);
				tiempoConsumido = tiempoConsumido + tiempoSalto;
				}
			//tiempoConsumido = tiempoConsumido + tiempoSalto;
			}else{++i;}//Si la Pista solicitada es 0 incremento i porque sino me imprime dos veces el sector 0:0

			do{
				printf("%i:%i, ", PistaBuscada, i);
				tiempoConsumido = tiempoConsumido + tiempoGiro;
				++i;
			}while(i != SectorBuscado);
			if (i == SectorBuscado){
				printf("%i:%i", PistaBuscada, i);
			}
		}
	}else{/*El sector buscado es menor a la posicion actual*/
		if(sentido==bajando){
			if (PistaActual == PistaBuscada){//Si estan en la misma pista
				for (i=SectorActual-1; i>SectorBuscado; --i){
					printf("%i:%i, ", PistaActual, i);
					tiempoConsumido = tiempoConsumido + tiempoGiro;
				}
				if (i==SectorBuscado){
					printf("%i:%i", PistaActual, i);
				}
			}else{//La pista es mayor
				i = SectorActual-1;
				for (j=PistaActual-1; j>PistaBuscada; --j){
					printf("%i:%i, ", j, i);
					tiempoConsumido = tiempoConsumido + tiempoSalto;
				}
				//tiempoConsumido = tiempoConsumido + tiempoSalto;
				do{
					printf("%i:%i, ", PistaBuscada, i);
					tiempoConsumido = tiempoConsumido + tiempoGiro;
					--i;
					if (i==-1){i = i + SECTORES;}//Seria algo parecid a cuando usaba el MOD(%) para que siempre sea un sector valido dentro de la pista
				}while(i != SectorBuscado);
				if (i == SectorBuscado){
					printf("%i:%i", PistaBuscada, i);
				}

			}
		}else{/***SE ESTA SUBIENDO ----> Hay que subir hasta el maximo sector y despues bajar***/
			int MaximaPista = PISTAS - 1;
			int MaximoSector = SECTORES - 1;
			i = SectorActual + 1;

			for (j = PistaActual+1; j<MaximaPista; ++j){
				printf("%i:%i, ", j, i);
				tiempoConsumido = tiempoConsumido + tiempoSalto;
			}
			do{
				printf("%i:%i, ", MaximaPista, i);
				tiempoConsumido = tiempoConsumido + tiempoGiro;
				++i;
			}while(i < MaximoSector);
			if (i==MaximoSector){
				printf("%i:%i, ", MaximaPista, MaximoSector);//llegamos al tope, ahora hay que bajar
			}//Ahora vamos a estar bajanndo, pero el flag de sentido no se modifica, lo modifico desde el thread que controla las colas
			if (PistaBuscada != MaximaPista){
				for (j=MaximaPista-1; j>PistaBuscada; --j){
					printf("%i:%i, ", j, i);
					tiempoConsumido = tiempoConsumido + tiempoSalto;
				}
				//tiempoConsumido = tiempoConsumido + tiempoSalto;
			}else{--i;}//Si la Pista solicitada es igual a la Pista Maxima decremento i porque sino me imprime dos veces el Sector Maximo
			do{
				printf("%i:%i, ", PistaBuscada, i);
				tiempoConsumido = tiempoConsumido + tiempoGiro;
				--i;
			}while(i != SectorBuscado);
			if (i == SectorBuscado){
				printf("%i:%i", PistaBuscada, i);
			}
		}
	}


	return tiempoConsumido;

}
